package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

// Tag 表示 Harbor 镜像标签信息的结构体
type Tag1 struct {
	ID                int    `json:"id"`
	Name              string `json:"name"`
	PushTime          string `json:"push_time"`
	PullTime          string `json:"pull_time"`
	ImageID           string `json:"image_id"`
	Signed            bool   `json:"signed"`
	ArtifactID        int    `json:"artifact_id"`
	ManifestMediaType string `json:"manifest_media_type"`
}

func main() {
	// Harbor 配置信息，请根据实际情况修改
	harborURL := "https://image.sourcefind.cn:5000" // 例如: "https://harbor.example.com"
	username := "chenwanchu"
	password := "Sugon@123"
	imageName := "dcu/admin/pytorch/pytorch" // 镜像名称，格式为 "项目名/镜像名"
	page := 1
	pageSize := 100 // 每次获取的标签数量

	// 对镜像名称进行 URL 编码处理（替换斜杠为 %2F）
	encodedImageName := strings.ReplaceAll(imageName, "/", "%2F")

	// 构建请求 URL
	url := fmt.Sprintf("%s/api/v2.0/projects/dcu/repositories/%s/tags?page=%d&page_size=%d",
		harborURL, encodedImageName, page, pageSize)

	// 创建 HTTP 客户端
	client := &http.Client{}

	// 创建请求
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		log.Fatalf("创建请求失败: %v", err)
	}

	// 设置认证信息
	req.SetBasicAuth(username, password)

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("发送请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 检查响应状态码
	if resp.StatusCode != http.StatusOK {
		log.Fatalf("请求失败，状态码: %d，URL: %s", resp.StatusCode, url)
	}

	// 读取响应内容
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("读取响应内容失败: %v", err)
	}

	// 解析 JSON 数据
	var tags []Tag1
	err = json.Unmarshal(body, &tags)
	if err != nil {
		log.Fatalf("解析 JSON 失败: %v，响应内容: %s", err, string(body))
	}

	// 输出标签信息
	fmt.Printf("镜像 %s 的标签列表 (共 %d 个):\n", imageName, len(tags))
	for i, tag := range tags {
		fmt.Printf("%d. 标签名称: %s\n", i+1, tag.Name)
		fmt.Printf("   推送时间: %s\n", tag.PushTime)
		fmt.Printf("   拉取时间: %s\n", tag.PullTime)
		fmt.Printf("   镜像ID: %s\n", tag.ImageID)
		fmt.Printf("   是否签名: %v\n", tag.Signed)
		fmt.Println("------------------------")
	}
}
